package com.mycompany.crm.service.impl;

import com.mycompany.crm.base.BaseQuery;
import com.mycompany.crm.base.BaseService;
import com.mycompany.crm.dao.DataDicMapper;
import com.mycompany.crm.service.DataDicService;
import com.mycompany.crm.utils.AssertUtil;
import com.mycompany.crm.vo.DataDic;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.Map;

/**
 * @author jy
 * @version 1.0
 * @date 2022/4/4 11:38
 */
@Service
public class DataDicServiceImpl extends BaseService<DataDic,Integer> implements DataDicService {

    @Autowired
    private DataDicMapper dataDicMapper;


    /**
     * 分页多条件查询字典列表
     *
     * @param baseQuery
     * @return java.util.Map<java.lang.String, java.lang.Object>
     */
    @Override
    public Map<String, Object> queryByParamsForTable(BaseQuery baseQuery) {
        return super.queryByParamsForTable(baseQuery);
    }

    /**
     * 添加数据字典
     *
     * @param dataDic
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void saveDataDic(DataDic dataDic) {
        //1.参数校验
        checkDataDicParams(dataDic.getDataDicName(),dataDic.getDataDicSn(),dataDic.getDataDicIntro(),null);
        //2.设置默认参数
        dataDic.setIsValid(1);
        dataDic.setCreateDate(new Date());
        dataDic.setUpdateDate(new Date());
        //执行添加，判断结果
        AssertUtil.isTrue(dataDicMapper.insertSelective(dataDic) < 1,"数据字典添加失败！");
    }

    /**
     * 数据字典完整性参数校验
     * @param dataDicName
     * @param dataDicSn
     * @param dataDicIntro
     * @param id
     */
    private void checkDataDicParams(String dataDicName, String dataDicSn, String dataDicIntro, Integer id) {
        // 判断用户名是否为空
        AssertUtil.isTrue(StringUtils.isBlank(dataDicName),"字典名称不能为空！");
        // 判断用户名的唯一性
        // 通过用户名查询用户对象
        DataDic dataDic = dataDicMapper.queryDataDicByName(dataDicName);
        // 如果用户对象为空，则表示用户名可用；如果用户对象不为空，则表示用户名不可用
        // 如果是添加操作，数据库中无数据，只要通过名称查到数据，则表示用户名被占用
        // 如果是修改操作，数据库中有对应的记录，通过用户名查到数据，可能是当前记录本身，也可能是别的记录
        // 如果用户名存在，且与当前修改记录不是同一个，则表示其他记录占用了该用户名，不可用
        AssertUtil.isTrue(null != dataDic && !(dataDic.getId().equals(id)),"数据字典已存在！");
        // 邮箱 非空
        AssertUtil.isTrue(StringUtils.isBlank(dataDicSn),"请输入字典编码！");
        // 手机号 非空
        AssertUtil.isTrue(StringUtils.isBlank(dataDicIntro),"请输入字典简介！");
    }

    /**
     * 更新数据字典
     *
     * @param dataDic
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void updateDataDic(DataDic dataDic) {
        DataDic temp = dataDicMapper.selectByPrimaryKey(dataDic.getId());
        //判断用户id是否为空且数据存在
        AssertUtil.isTrue(null == dataDic.getId() || null == temp,"待更新记录不存在！");
        //参数校验
        checkDataDicParams(dataDic.getDataDicName(),dataDic.getDataDicSn(),dataDic.getDataDicIntro(),dataDic.getId());
        //设置默认值
        dataDic.setUpdateDate(new Date());
        //执行更新操作，判断受影响的行数
        AssertUtil.isTrue(dataDicMapper.updateByPrimaryKeySelective(dataDic) != 1,"数据字典更新失败！");
    }


}
